package com.example.shop.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
public class MyBatisPlusConfig {
    // 1. 配置MyBatis-Plus的SqlSessionFactory（强制使用MyBatis-Plus的实现）
    @Bean
    public MybatisSqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        // 设置数据源（Spring自动配置的MySQL数据源）
        sessionFactory.setDataSource(dataSource);
        // 配置MyBatis-Plus的插件（如分页插件，可选）
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        sessionFactory.setPlugins(interceptor);
        // 配置实体类别名包（可选）
        sessionFactory.setTypeAliasesPackage("com.example.shop.entity");
        // 配置Mapper XML文件路径（若没有XML，注释此行）
        // sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/xml/*.xml"));
        return sessionFactory;
    }

    // 2. 配置Mapper扫描器（强制扫描Mapper包，注册为Spring Bean）
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer scanner = new MapperScannerConfigurer();
        // 强制扫描Mapper接口所在的包，必须与实际包一致
        scanner.setBasePackage("com.example.shop.mapper");
        // 指定SqlSessionFactory的bean名称（关联上面的sqlSessionFactory）
        scanner.setSqlSessionFactoryBeanName("sqlSessionFactory");
        return scanner;
    }

    // 3. 配置事务管理器（可选，MyBatis-Plus操作数据库需要）
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}
